package com.jaay.dao;

import lombok.Getter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Query;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

/**
 * @author chencanfeng
 * @param <T>
 * @param <ID>
 */
@Getter
public abstract class BaseDao<T, ID extends Serializable> implements IBaseDao<T, ID> {


    private final Class<T> entityClass;

    public BaseDao() {
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        this.entityClass = (Class<T>) pt.getActualTypeArguments()[0];

    }

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 查询列表
     *
     * @return 返回列表
     */
    @Override
    public List<T> findAll() {

        return mongoTemplate.findAll(entityClass);

    }

    /**
     * 根据条件查询所有
     *
     * @param query 查询条件
     * @return 查询列表
     */
    @Override
    public List<T> findAll(Query query) {

        return mongoTemplate.find(query, entityClass);

    }

    /**
     * 根据ID查询对象
     *
     * @param id 编号
     * @return 返回查询对象
     */
    @Override
    public T findById(ID id) {

        return mongoTemplate.findById(id, entityClass);
    }

    /**
     * 根据条件删除对象
     *
     * @param query 删除条件
     */
    @Override
    public void delete(Query query) {

        mongoTemplate.remove(query, entityClass);
    }

    /**
     * 聚合操作
     *
     * @param aggregation    聚合操作
     * @param collectionName 集合名称
     * @return 聚合结果
     */
    @Override
    public AggregationResults<T> aggregate(Aggregation aggregation, String collectionName) {

        return mongoTemplate.aggregate(aggregation, collectionName, entityClass);

    }
}
